package com.foundation;

import org.junit.Test;

/**
 * 简单的把enum类变成静态常量
 * Created by 85243 on 2017/3/7.
 */
public class EnumClass {

    public static void main(String[] args) {
        String str = "SMALL";
        Size size = Enum.valueOf(Size.class,str);
        Size.valueOf("small");
        System.out.println(size);
    }

    /**
     枚举类初始化顺序，枚举类先执行构造方法块，再执行构造方法，当所有变量初始化完成后再调用静态方法块。一般类先执行静态方法块->构造方法块->构造方法

     反编译后，发现枚举变量实际在静态代码块中进行初始化，因为类的加载和初始化是线程安全的，所以enum类也是线程安全的。
     参考：https://blog.csdn.net/C_AJing/article/details/105857968
     */
    @Test
    public void testConstruct(){
        Size size = Size.SMALL;
        System.out.println(size);
    }
}
enum Size{

    SMALL,MEDIUM("medium",2),LARGE;
    private String name;
    private int size;


    // 静态代码块
    static {
        Size.valueOf("SMALL").name = "small";
        Size.valueOf("SMALL").size  = 1;
        System.out.println("枚举中静态代码块执行了");
    }
    // 构造方法
    private Size() {
        System.out.println("枚举中构造方法执行了");
    }
    // 构造方法
    private Size(String name,Integer size) {
        this.name = name;
        this.size = size;
        System.out.println("枚举中构造方法执行了:"+this.name);
    }

    // 构造代码块
    {
        System.out.println("枚举中代码块执行了:"+this.name);
    }
}



